package org.xx.armory.db.junit.impl;

import org.slf4j.LoggerFactory;
import org.xx.armory.db.junit.DbUnitHelper;

import javax.sql.DataSource;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 用于Derby数据库的单元测试工具类。
 *
 * @author Haart
 */
public class DerbyDbUnitHelper
        extends AbstractDbUnitHelper
        implements DbUnitHelper {
    /**
     * 构造用于Derby数据库的单元测试工具类。
     *
     * @param dataSource
     *         此工具类使用的数据源。
     * @throws NullPointerException
     *         如果参数{@code dataSource}是{@code null}。
     */
    public DerbyDbUnitHelper(
            DataSource dataSource
    ) {
        super(dataSource);
    }

    /**
     * 构造用于Derby数据库的单元测试工具类。
     *
     * @param url
     *         连接Derby数据库的URL。
     * @param user
     *         连接Derby数据库的用户名。
     * @param password
     *         连接Derby数据库的口令。
     */
    public DerbyDbUnitHelper(
            String url,
            String user,
            String password
    ) {
        super(url, user, password);
    }

    /**
     * 创建数据库。
     *
     * @param url
     *         Derby数据库的URL。
     */
    public static void create(
            String url
    ) {
        try {
            DriverManager.getConnection(url + ";create=true").close();
        } catch (SQLException ex) {
            LoggerFactory.getLogger(DerbyDbUnitHelper.class).error("failed to create test data [{}]", url, ex);
        }
    }

    /**
     * 删除数据库。
     *
     * @param url
     *         Derby数据库的URL。
     */
    public static void drop(
            String url
    ) {
        try {
            DriverManager.getConnection(url + ";drop=true");
        } catch (SQLException ex) {
            // When you drop the database, Derby issues what appears to be an
            // error but is
            // actually an indication of success. You need to catch error 08006,
            // as described in "The
            // WwdEmbedded program" in Getting Started with Java DB.
            if (!"08006".equals(ex.getSQLState())) {
                LoggerFactory.getLogger(DerbyDbUnitHelper.class)
                             .error("failed to drop test data [{}]", url, ex);
            }
        }
    }
}
